package com.ncu.TestOne.Test01;

import com.ncu.spring.ApplicationContext;
import com.ncu.spring.BeanDefinition;

//编写测试用例
public class Test {
    public static void main(String[] args) {
        //在构造方法时：就会执行Refresh流程
        //本人实现的Refresh流程如下
        /*
            1.扫描当前包，将该包下所有被@Component修饰类创建BeanDefinition加入到Map中
            2.创建bean后处理器：默认会创建自动代理后处理器。然后扫描BeandefinitionMap
              map中是否有实现了BeanPostProcessor接口的类有就调用getBean()获取对象一并
              加入到beanPostProcessorList
            3.对所有的作用域为单例的创建对象放入至一级缓存中：getBean()
              getBean()方法：先去一级、二级、三级缓存查看是否有当前对象，如果没有就创建对象(Test02会详细阐述)
              创建对象的时候会走创建对象的流程：
                1.创建：首先会选取无参构造，如果没有无参构造，会选择第一个有参构造
                  如果使用@Lazy防止构造导致的依赖注入就会创建代理对象
                  如果使用工厂对象防止构造导致的依赖注入就会创建工厂对象
                  如果上诉都没有就会getBean()得到这个有参构造方法的参数
                  将对象放入三级缓存。防止出现set方法导致的依赖注入
                2.
        */
        ApplicationContext context = new ApplicationContext(config.class);
        System.out.println("BeanDefinationMap中加载的类");
        for (BeanDefinition beanDefinition : context.getBeanDefinition()) {
            System.out.println(beanDefinition.getType()+" "+beanDefinition.getScope());
        }
        Object o1 = context.getBean("object2");//获取单例对象,存放在单例池中
        Object o2 = context.getBean("object2");
        System.out.println("单例作用域,调用getBean获取两个对象："+(o1==o2));

        Object o3 = context.getBean("objectA"); //获取多例对象，创建的是一个新对象
        Object o4 = context.getBean("objectA");
        System.out.println("多例作用域,调用getBean获取两个对象："+(o3==o4));
    }
}
